package 设计模式.模板模式.improve;

//抽象类，表示豆浆
public abstract class SoyaMilk {
    //模板方法,make，模板方法可以做成final，不让子类去覆盖
    final void make() {
        select();
        if (customerWantCondiments()) {
            addCondiments();
        }
        soak();
        beat();
    }

    //选材料
    void select() {
        System.out.println("第一步：选择好的新鲜黄豆");
    }

    //添加不同的配料，抽象方法，子类具体实现
    abstract void addCondiments();

    //侵泡
    void soak() {
        System.out.println("第三步，黄豆和配料开始侵泡，需要3个小时");
    }

    //打浆
    void beat() {
        System.out.println("第四步：黄豆和配料放到豆浆机去打碎");
    }

    /**
     * 模板方法模式的钩子方法
     * 1) 在模板方法模式的父类中，我们可以定又一个方法，它默认不做任何事，子类可以
     * 视情况要不要覆盖它，该方法称为“钩子”。
     * 2)还是用上面做豆浆的例子来讲解，比如，我们还希望制作纯豆浆，不添加任何的配
     * 料，请使用钩子方法对前面的模板方法进行改造
     */
    boolean customerWantCondiments() {
        return true;
    }
}
